package com.iot.dw.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.springframework.util.ObjectUtils;

import java.util.List;



public class GbxfDecoder extends ByteToMessageDecoder {
    public GbxfDecoder() {
    }
    public static byte  getCheckCode(ByteBuf msg,int start,int len){
        short r=0;
        for(var i=start;i<start+len;i++){
            r+=msg.getByte(i);
        }
        return  (byte)(r%256);
    }
    public static String getGW(ByteBuf msg ,int index){
        return String.format("%d.%d.%d.%d.%d.%d",
                msg.getByte(index+5),
                msg.getByte(index+4),
                msg.getByte(index+3),
                msg.getByte(index+2),
                msg.getByte(index+1),
                msg.getByte(index+0)
                );
    }
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        GbxfMessage m=null;


        var index=0;
        while ( 30<=msg.readableBytes() )
        {
            m=new GbxfMessage();

            m.setDataLen(msg.getByte(index+24)+msg.getByte(index+25)<<8);
            if(m.getDataLen()>0){
                if(index+30+m.getDataLen()>msg.readableBytes())
                {
                    m.setHexStr( ByteBufUtil.hexDump(msg,index,msg.readableBytes()  ));
                    m.setErrMsg("长度错误");
                    msg.readerIndex(msg.readableBytes() );
                    out.add(m);
                    break;
                }
            }
            m.setData( ByteBufUtil.getBytes(msg,index+27,m.getDataLen() ) );


            if(msg.getByte(index+0)!=0x40
                ||msg.getByte(index+0)!=0x40)
            {
                m.setHexStr( ByteBufUtil.hexDump(msg,index,msg.readableBytes() ));
                m.setErrMsg("包头错误");
                msg.readerIndex(msg.readableBytes() );
                out.add(m);
                break;
            }
            m.setSeqno( msg.getByte(index+2)+(msg.getByte(index+3)<<8));
            m.setVerh(msg.getByte(index+4));
            m.setVerl(msg.getByte(index+5));
            m.setId( getGW(msg,index+12) );
            m.setCmd(msg.getByte(index+26));




            var checkCode=getCheckCode(msg,index+2,m.getDataLen()+25);
            if(checkCode!=msg.getByte(index+27)){
                m.setHexStr( ByteBufUtil.hexDump(msg,index,msg.readableBytes()  ));
                m.setErrMsg("校验码错误");
                msg.readerIndex(msg.readableBytes() );
                out.add(m);
                break;
            }
            if(msg.getByte(index+28+m.getDataLen())!=0x23
                    ||msg.getByte(index+29+m.getDataLen())!=0x23)
            {
                m.setHexStr( ByteBufUtil.hexDump(msg,index,msg.readableBytes()  ));
                m.setErrMsg("包尾错误");
                msg.readerIndex(msg.readableBytes() );
                out.add(m);
                break;
            }
            index+=30+m.getDataLen();
            msg.readerIndex(index );
            m.setSuccess(true);
            out.add(m);

        }
        if(msg.readableBytes()>0 ) {
            m=new GbxfMessage();
            m.setErrMsg("长度错误");
            m.setHexStr(
                    ByteBufUtil.hexDump(msg,index,msg.readableBytes() )
            );
            msg.readerIndex(index+msg.readableBytes() );
            out.add(m);
        }
    }
}
